// Copyright (C) 2019 Leo Balter. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: Resolving with an object with a "poisoned" `then` property
esid: sec-promise.allsettled
info: |
  Runtime Semantics: PerformPromiseAllSettled ( iteratorRecord, constructor, resultCapability )

  4. Let remainingElementsCount be a new Record { [[Value]]: 1 }.
  ...
  6.d ...
    ii. Set remainingElementsCount.[[value]] to remainingElementsCount.[[value]] − 1.
    iii. If remainingElementsCount.[[value]] is 0, then
      1. Let valuesArray be CreateArrayFromList(values).
      2. Perform ? Call(resultCapability.[[Resolve]], undefined, « valuesArray »).
  ...
flags: [async]
features: [Promise.allSettled]
---*/

function Test() {
    var value = {};
    var promise;

    try {
      Object.defineProperty(Array.prototype, 'then', {
        get() {
          throw value;
        },
        configurable: true
      });

      promise = Promise.allSettled([]);
    } finally {
      delete Array.prototype.then;
    }

    promise.then(function() {
      $DONE('The promise should not be fulfilled.');
    }, function(val) {
      if (val !== value) {
        $DONE('The promise should be rejected with the expected value.');
        return;
      }

      $DONE();
    });
}

// preheat
const NUMBER_OF_PREHEAT = 1;
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}

ArkTools.jitCompileAsync(Test);
assert.sameValue(ArkTools.waitJitCompileFinish(Test), true, '[JIT] JIT disabled.');

// test
const NUMBER_OF_TEST = 1; // or 2
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}
